#pragma once

#include  "iostream"
#include  "vector"
#include  "stack"
#include  "unordered_map"
#include   "queue"

using namespace std;


/**
 *
 * 974. 和可被 K 整除的子数组
中等
434
相关企业
给定一个整数数组 nums 和一个整数 k ，返回其中元素之和可被 k 整除的（连续、非空） 子数组 的数目。

子数组 是数组的 连续 部分。



示例 1：

输入：nums = [4,5,0,-2,-3,1], k = 5
输出：7
解释：
有 7 个子数组满足其元素之和可被 k = 5 整除：
[4, 5, 0, -2, -3, 1], [5], [5, 0], [5, 0, -2, -3], [0], [0, -2, -3], [-2, -3]
示例 2:

输入: nums = [5], k = 9
输出: 0
 *
 *
 *
 *
 * */


int subarraysDivByK(vector<int> &nums, int k) {

    int N = nums.size(), sum = 0, ans = 0;
    unordered_map<int, int> map;
    map[0] = 1;//在算法的实现中，是统计的重复次数（重复次数，一次不算），但是实际情况中，0也算一种解决，所以要提前加一个0进去，这样模为0就正常了
    for (int i = 1; i <= N; i++) {
        sum = sum + nums[i - 1];
        int key = (sum % k + k) % k;
        ans += map[key]; //很巧就能ok
        map[key]++;
    }
    //
    // 12 13 23   1 +2 +3
    // 12 13 14 23 24 34

    return ans;

}


int subarraysDivByK1(vector<int> &nums, int k) {

    int sum = 0;

    unordered_map<int, int> map;
    map[0] = 1;
    int ans = 0;
    for (int i = 0; i < nums.size(); i++) {
        sum += nums[i];
        int key = (sum % k + k) % k;
        ans += map[key]; //很巧就能ok
        map[key]++;

    }

    return ans;

}